home *** CD-ROM | disk | FTP | other *** search
/ 17 Bit Software 6: Level 6 / 17 Bit - Level 6 (1998)(Epic Marketing)[!].iso / quartz / q1082.dms / q1082.adf / src.lzh / Fig / GadgetStuff.c < prev    next >
C/C++ Source or Header  |  1991-07-18  |  3KB  |  158 lines

  1. struct MetaGadget
  2. {
  3.     struct Image     Image;
  4.     LONG         MutualExclude;
  5.  
  6.     struct Gadget     Gadget;
  7. };
  8.  
  9. STATIC struct Gadget    *FirstGadget = NULL,*LastGadget = NULL;
  10. STATIC LONG         Count = 0;
  11.  
  12. VOID
  13. ClearGadgets()
  14. {
  15.     struct MetaGadget    *Meta;
  16.     struct Gadget        *Gadget,*NextGadget;
  17.  
  18.     Gadget = FirstGadget;
  19.  
  20.     while(Gadget)
  21.     {
  22.         NextGadget = Gadget -> NextGadget;
  23.  
  24.         Meta = (struct MetaGadget *)Gadget -> UserData;
  25.  
  26.         if(Meta -> Image . ImageData)
  27.             FreeMem(Meta -> Image . ImageData,byte(Gadget -> Width) * Gadget -> Height);
  28.  
  29.         FreeMem(Meta,sizeof(struct MetaGadget) + 10);
  30.  
  31.         Gadget = NextGadget;
  32.     }
  33.  
  34.     FirstGadget = NULL;
  35. }
  36.  
  37. struct Gadget *
  38. AddMyGadget(SHORT LeftEdge,SHORT TopEdge,SHORT Width,SHORT Height,LONG MutualExclude,BYTE Selected,UWORD *ImageData)
  39. {
  40.     struct MetaGadget *Meta;
  41.  
  42.     if(Meta = (struct MetaGadget *)AllocMem(sizeof(struct MetaGadget) + 10,MEMF_PUBLIC|MEMF_CLEAR))
  43.     {
  44.         if(Meta -> Image . ImageData = (UWORD *)AllocMem(byte(Width) * Height,MEMF_CHIP|MEMF_CLEAR))
  45.         {
  46.             Meta -> Image . Width        = Width;
  47.             Meta -> Image . Height        = Height;
  48.             Meta -> Image . Depth        = 1;
  49.             Meta -> Image . PlanePick    = 1;
  50.  
  51.             CopyMem(ImageData,Meta -> Image . ImageData,byte(Width) * Height);
  52.  
  53.             if(LastGadget)
  54.                 LastGadget -> NextGadget = &Meta -> Gadget;
  55.  
  56.             LastGadget = &Meta -> Gadget;
  57.  
  58.             if(!FirstGadget)
  59.                 FirstGadget = &Meta -> Gadget;
  60.  
  61.             Meta -> Gadget . LeftEdge    = LeftEdge;
  62.             Meta -> Gadget . TopEdge    = TopEdge;
  63.  
  64.             Meta -> Gadget . Width        = Width;
  65.             Meta -> Gadget . Height        = Height;
  66.  
  67.             Meta -> Gadget . Flags        = GADGHCOMP|GADGIMAGE;
  68.  
  69.             if(Selected)
  70.                 Meta -> Gadget . Flags |= SELECTED;
  71.  
  72.             Meta -> Gadget . Activation    = GADGIMMEDIATE|TOGGLESELECT;
  73.             Meta -> Gadget . GadgetType    = BOOLGADGET;
  74.  
  75.             Meta -> Gadget . GadgetRender    = &Meta -> Image;
  76.             Meta -> Gadget . GadgetID    = Count++;
  77.             Meta -> Gadget . UserData    = Meta;
  78.  
  79.             if(MutualExclude != -1)
  80.                 Meta -> MutualExclude = (1 << MutualExclude);
  81.  
  82.             return(&Meta -> Gadget);
  83.         }
  84.         else
  85.             FreeMem(Meta,sizeof(struct MetaGadget) + 10);
  86.     }
  87.  
  88.     return(NULL);
  89. }
  90.  
  91. VOID
  92. RefreshGadget(struct Window *Window,struct Gadget *Gadget)
  93. {
  94.     struct Gadget *NextGadget = Gadget -> NextGadget;
  95.  
  96.     Gadget -> NextGadget = NULL;
  97.  
  98.     RefreshGadgets(Gadget,Window,NULL);
  99.  
  100.     Gadget -> NextGadget = NextGadget;
  101. }
  102.  
  103. LONG
  104. HandleGadget(struct Window *Window,struct IntuiMessage *Massage)
  105. {
  106.     STATIC BYTE Mutuals[] =
  107.     {
  108.         1,1,1,1,1,1,1,1,
  109.         1,1,1,1,1,1,1,1,
  110.         1,1,1,1,1,1,1,1,
  111.         1,1,1,1,0,0,1,1,
  112.         1,1,1,1,0,0,1,1,1
  113.     };
  114.  
  115.     struct Gadget    *Gadget;
  116.     struct Gadget    *MyGadget;
  117.  
  118.     if(Massage -> Class == GADGETDOWN)
  119.     {
  120.         LONG MutualExclude;
  121.  
  122.         MyGadget = Massage -> IAddress;
  123.  
  124.         ReplyMsg(&Massage -> ExecMessage);
  125.  
  126.         if(MutualExclude = ((struct MetaGadget *)MyGadget -> UserData) -> MutualExclude)
  127.         {
  128.             Gadget = FirstGadget;
  129.  
  130.             while(Gadget)
  131.             {
  132.                 if(Gadget != MyGadget)
  133.                 {
  134.                     if((((struct MetaGadget *)Gadget -> UserData) -> MutualExclude & MutualExclude) && Gadget -> Flags & SELECTED)
  135.                     {
  136.                         Gadget -> Flags &= ~SELECTED;
  137.  
  138.                         RefreshGadget(Window,Gadget);
  139.                     }
  140.                 }
  141.  
  142.                 Gadget = Gadget -> NextGadget;
  143.             }
  144.  
  145.             if(!(MyGadget -> Flags & SELECTED) && Mutuals[MyGadget -> GadgetID])
  146.             {
  147.                 MyGadget -> Flags |= SELECTED;
  148.  
  149.                 RefreshGadget(Window,MyGadget);
  150.             }
  151.         }
  152.  
  153.         return((LONG)MyGadget -> GadgetID);
  154.     }
  155.     else
  156.         return(-1);
  157. }
  158.